<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>节流</title>
  <script src="./day14/lodash.min.js"></script>
  <style>
    .box {
      width: 200px;
      height: 200px;
      background-color: red;
    }

    .box1 {
      margin-top: 100px;
      width: 200px;
      height: 200px;
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="box"></div>
  <div class="box1"></div>
  <script>
    // 原理:在规定时间内,只执行一次
    let i = 1
    const box = document.querySelector('.box')
    function btn() {
      box.innerHTML = i++
    }
    // box.addEventListener('click', btn)
    // 在这5秒内只会执行一次btn方法
    box.addEventListener('click', _.throttle(btn, 5000))

    // 手写
    let i1 = 1
    const box1 = document.querySelector('.box1')
    function btn1() {
      box1.innerHTML = i++
    }

    // 手写节流函数
    // 原理:利用定时器
    // 1.声明一个定时器变量
    // 2.当触发事件时,先判断有没有定时器,有则不开启定时器
    // 3.如果没有定时器,则存到变量里面去
    // 4.定时器里面调用执行的函数
    // 5.定时器里面要把定时器清空

    // 注意:如果在setTimerout中清除定时器,要给它赋值为null,手动清除
    function throttle(fn, t) {
      let timer = null
      return function () {
        // 如果有定时器
        if (!timer) {
          timer = setTimeout(() => {
            fn()
            // 清空定时器
            timer = null
          }, t)
        }
      }
    }

    // 在这5秒内只会执行一次btn方法
    box1.addEventListener('click', throttle(btn1, 5000))
  </script>
</body>

</html>